route.ts 1.1 KB

1234567891011121314151617181920212223242526272829
  1. import { auth } from "@/lib/auth";
  2. import { rateLimit } from "@/lib/rate-limit";
  3. import { toNextJsHandler } from "better-auth/next-js";
  4. const { POST: authPOST, GET } = toNextJsHandler(auth);
  5. // Path prefixes that need stricter rate limits.
  6. // Better-auth registers sub-paths like /sign-in/email, /sign-up/email,
  7. // /two-factor/verify-totp, etc., so we match by prefix.
  8. const strictPrefixes: { prefix: string; limit: number; windowMs: number }[] = [
  9. { prefix: "/api/auth/sign-in", limit: 10, windowMs: 60_000 },
  10. { prefix: "/api/auth/two-factor/verify", limit: 10, windowMs: 60_000 },
  11. { prefix: "/api/auth/sign-up", limit: 5, windowMs: 60_000 },
  12. { prefix: "/api/auth/request-password-reset", limit: 5, windowMs: 60_000 },
  13. { prefix: "/api/auth/reset-password", limit: 5, windowMs: 60_000 },
  14. ];
  15. const defaultConfig = { limit: 30, windowMs: 60_000 };
  16. async function POST(request: Request) {
  17. const { pathname } = new URL(request.url);
  18. const config =
  19. strictPrefixes.find((p) => pathname.startsWith(p.prefix)) ?? defaultConfig;
  20. const limited = rateLimit(request, config);
  21. if (limited) return limited;
  22. return authPOST(request);
  23. }
  24. export { GET, POST };